package com.ruoyi.business.service;

import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

public interface IProcessService {
    /**
     * 根据上传的文件进行流程定义部署
     * @param filePast
     * @return
     */
    Deployment deploy(String filePast) throws FileNotFoundException;

    /**
     * 根据流程部署Id 找到对应的流程定义信息
     * @param deploymentId
     * @return
     */
    ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId);

    /**
     * 根据部署id查询对象的Bpmn文件
     * @param deploymentId
     * @return
     */
    InputStream getBpmnInputStream(String deploymentId);

    /**
     * 根据流程部署id获取流程图png
     * @param deploymentId
     * @return
     */
    InputStream getProcessImage(String deploymentId);

    /**
     * 流程启动
     * @param definitionKey
     * @param businessKey
     * @param variables
     * @return
     */
    ProcessInstance startProcessInstance(String definitionKey, String businessKey, Map<String, Object> variables);

    /**
     * 通过流程实例id获取当前的任务节点
     * @param processInstanceId
     * @return
     */
    Task getTaskByProcessInstanceId(String processInstanceId);

    /**
     * 给当前任务设置候选人
     * @param task
     * @param userId
     */
    void addCandidateUser(Task task, Long userId);

    /**
     * 根据流程实例获取流程图
     * @param instanceId
     * @return
     */
    InputStream getProcessImgByInstanceId(String instanceId);

    /**
     * 根据流程实例ID删除流程
     * @param instanceId
     */
    void deleteProcessInstance(String instanceId);

    /**
     * 根据用户ID查询当前用户总共有多少个待办任务
     * @param definitionKey
     * @param userId
     * @return
     */
    Long getTodoTaskCount(String definitionKey, String userId);

    /**
     * 分页查询待办任务
     * @param definitionKey
     * @param userId
     * @param startNum
     * @param pageSize
     * @return
     */
    List<Task> selectTodoList(String definitionKey, String userId, Integer startNum, Integer pageSize);

    /**
     * 根据流程实例ID获取流程实例
     * @param processInstanceId
     * @return
     */
    ProcessInstance getProcessInstanceById(String processInstanceId);

    /**
     * 根据任务ID获取任务对象
     * @param taskId
     * @return
     */
    Task getTaskByTaskId(String taskId);

    /**
     * 完成任务
     * @param task
     * @param userId
     * @param auditStatus
     * @param comment
     */
    void claimAndComplete(Task task, String userId, Boolean auditStatus, String comment);

    /**
     * 重新申请
     * @param task
     * @param userId
     * @param comment
     */
    void claimAndComplete(Task task, String userId, String comment);

    /**
     * 设置流程变量
     * @param taskId
     * @param key
     * @param value
     */
    void setVariable(String taskId, String key, long value);

    /**
     * 查询历史已办任务
     * @param definitionKey
     * @param userId
     * @return
     */
    long getHistoricTaskCount(String definitionKey, String userId);

    /**
     * 查询对应用户的已办任务
     * @param definitionKey
     * @param userId
     * @param startNum
     * @param pageSize
     * @return
     */
    List<HistoricTaskInstance> selectHistoricTaskList(String definitionKey, String userId, Integer startNum, Integer pageSize);

    /**
     * 获取历史流程实例
     * 可以获取到业务key
     * @param processInstanceId
     * @return
     */
    HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId);

    /**
     * 根据流程实例获取历史审核信息
     * @param instanceId
     */
    List<HistoricActivityInstance> selectHistoricActivityList(String instanceId);

    /**
     * 查询任务的批注信息
     * @param taskId
     * @return
     */
    String getComment(String taskId);

}
